package br.com.registrofinancas.database;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import br.com.registrofinancas.model.MovimentationVO;
import br.com.registrofinancas.model.MovimentationVO.MovimentationIcon;
import br.com.registrofinancas.util.UsuarioUtils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;

public class MovimentosDAO {
	protected Context contexto;
	protected SQLiteDatabase db;
	protected SQLiteStatement insertStatement;
	protected static final String TABELA = "MOVIMENTOS";
	@SuppressLint("SimpleDateFormat")
	public static final SimpleDateFormat FORMATA_DATA = new SimpleDateFormat("yyyy-MM-dd");
	
	public MovimentosDAO(Context contexto) {
		this.contexto = contexto;
		this.db = DataSource.geDBtInstance(contexto);
	}
	
	public long delete( MovimentationVO movimento ){
		String [] parametros = {movimento.getId().toString()};
		return db.delete(TABELA, "id = ?", parametros);
	}

	public long deleteAll( ) {
		return db.delete( TABELA, null, null ) ;
	}
	
	public List<MovimentationVO> getAllMovimentations(){
		List<MovimentationVO> list = new ArrayList<MovimentationVO>( ) ;
		StringBuilder query = new StringBuilder();
		query.append("SELECT MOV.id, MOV.id_categoria, MOV.valor,  MOV.data, MOV.observacao, MOV.latitude, MOV.longitude\n");
		query.append("FROM MOVIMENTOS MOV\n");
		query.append("JOIN CATEGORIAS CAT ON CAT.id = MOV.id_categoria\n");
		query.append("WHERE CAT.id_usuario = ?\n");
		query.append("ORDER BY MOV.id\n");
		
		String [] parametros =  {UsuarioUtils.getIdUsuario().toString()};
		
		Cursor cursor = db.rawQuery(query.toString(), parametros) ;
		if (cursor.moveToFirst( )) {
			do {
				try {
					MovimentationVO movimento = new MovimentationVO( ) ;
					movimento.setId( cursor.getInt( 0 ) ) ;
					
					CategoriasDAO categoriaDAO = new CategoriasDAO(contexto);
					movimento.setCategory( categoriaDAO.selectById(cursor.getInt( 1 )) ) ;
					
					movimento.setValue( cursor.getDouble( 2 ) ) ;
					movimento.setOperationDate( MovimentosDAO.FORMATA_DATA.parse(cursor.getString( 3 )) ) ;
					movimento.setDescription( cursor.getString( 4 ) ) ;
					movimento.setLatitude(cursor.getDouble(5));
					movimento.setLongitude(cursor.getDouble(6));
					list.add( movimento ) ;					
				} catch (ParseException e) {
					e.printStackTrace();
				}

			}
			while (cursor.moveToNext( )) ;
		}
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		return list ;
	}
	
	public List<MovimentationVO> getMovimentationPorDia(Date data) {
		List<MovimentationVO> list = new ArrayList<MovimentationVO>( ) ;
		StringBuilder query = new StringBuilder();
		//Cursor cursor = 
		//		this.db.query( TABELA, new String[ ] { "id", "id_categoria", "valor", "data", "observacao" }, 
		//					   "data = ?", new String[]{MovimentosDAO.FORMATA_DATA.format(data)}, null, null, "id" ) ;
		
		query.append("SELECT MOV.id, MOV.id_categoria, MOV.valor,  MOV.data, MOV.observacao, MOV.latitude, MOV.longitude\n");
		query.append("FROM MOVIMENTOS MOV\n");
		query.append("JOIN CATEGORIAS CAT ON CAT.id = MOV.id_categoria\n");
		query.append("WHERE data = ?\n");
		query.append("  AND CAT.id_usuario = ?\n");
		query.append("ORDER BY MOV.id\n");
		
		String [] parametros =  {MovimentosDAO.FORMATA_DATA.format(data) , 
								 UsuarioUtils.getIdUsuario().toString()};
		
		Cursor cursor = db.rawQuery(query.toString(), parametros) ;		
		
		if (cursor.moveToFirst( )) {
			do {
				try {
					MovimentationVO movimento = new MovimentationVO( ) ;
					movimento.setId( cursor.getInt( 0 ) ) ;
					
					CategoriasDAO categoriaDAO = new CategoriasDAO(contexto);
					movimento.setCategory( categoriaDAO.selectById(cursor.getInt( 1 )) ) ;
					
					movimento.setValue( cursor.getDouble( 2 ) ) ;
					movimento.setOperationDate( MovimentosDAO.FORMATA_DATA.parse(cursor.getString( 3 )) ) ;
					movimento.setDescription( cursor.getString( 4 ) ) ;
					movimento.setLatitude(cursor.getDouble(5));
					movimento.setLongitude(cursor.getDouble(6));					
					list.add( movimento ) ;					
				} catch (ParseException e) {
					e.printStackTrace();
				}

			}
			while (cursor.moveToNext( )) ;
		}
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		return list ;		
	}
	
	public List<MovimentationVO> getMovimentationPorMes(Date data) {
		List<MovimentationVO> list = new ArrayList<MovimentationVO>( ) ;
		StringBuilder query = new StringBuilder();
		//Cursor cursor = 
		//		this.db.query( TABELA, new String[ ] { "id", "id_categoria", "valor", "data", "observacao" }, 
		//					   "data = ?", new String[]{MovimentosDAO.FORMATA_DATA.format(data)}, null, null, "id" ) ;
		
		query.append("SELECT MOV.id, MOV.id_categoria, MOV.valor,  MOV.data, MOV.observacao, MOV.latitude, MOV.longitude\n");
		query.append("FROM MOVIMENTOS MOV\n");
		query.append("JOIN CATEGORIAS CAT ON CAT.id = MOV.id_categoria\n");
		query.append("WHERE SUBSTR(data,1,7) = ?\n");
		query.append("  AND CAT.id_usuario = ?\n");
		query.append("ORDER BY MOV.id\n");
		
		String [] parametros =  {new SimpleDateFormat("yyyy-MM").format(data) , 
								 UsuarioUtils.getIdUsuario().toString()};
		
		Cursor cursor = db.rawQuery(query.toString(), parametros) ;		
		
		if (cursor.moveToFirst( )) {
			do {
				try {
					MovimentationVO movimento = new MovimentationVO( ) ;
					movimento.setId( cursor.getInt( 0 ) ) ;
					
					CategoriasDAO categoriaDAO = new CategoriasDAO(contexto);
					movimento.setCategory( categoriaDAO.selectById(cursor.getInt( 1 )) ) ;
					
					movimento.setValue( cursor.getDouble( 2 ) ) ;
					movimento.setOperationDate( MovimentosDAO.FORMATA_DATA.parse(cursor.getString( 3 )) ) ;
					movimento.setDescription( cursor.getString( 4 ) ) ;
					movimento.setLatitude(cursor.getDouble(5));
					movimento.setLongitude(cursor.getDouble(6));					
					list.add( movimento ) ;					
				} catch (ParseException e) {
					e.printStackTrace();
				}

			}
			while (cursor.moveToNext( )) ;
		}
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		return list ;		
	}	
	
	public MovimentationIcon getMovimentationIconPorDia(Date data) {
		StringBuilder query = new StringBuilder();

		query.append("SELECT CASE WHEN MIN(CAT.tipo) = 0 AND MAX(CAT.tipo) = 0 THEN 0 \n");
		query.append("		 	  WHEN MIN(CAT.tipo) = 1 AND MAX(CAT.tipo) = 1 THEN 1 \n");
		query.append("			  WHEN MIN(CAT.tipo) = 0 AND MAX(CAT.tipo) = 1 THEN 2 END tipo \n");
		query.append("FROM MOVIMENTOS MOV\n");
		query.append("JOIN CATEGORIAS CAT ON CAT.id = MOV.id_categoria\n");
		query.append("WHERE data = ?\n");
		query.append("  AND CAT.id_usuario = ?\n");		
		query.append("GROUP BY MOV.data\n");
		query.append("ORDER BY MOV.data\n");		
		
		String[] parametros = new String[]{	MovimentosDAO.FORMATA_DATA.format(data), 
											UsuarioUtils.getIdUsuario().toString()};
		
		Cursor cursor = this.db.rawQuery(query.toString(), parametros);
		
		MovimentationIcon retorno;
		if (cursor.moveToFirst( )) {
			switch (cursor.getInt( 0 )) {
			case 0:
				retorno = MovimentationIcon.INCOME;
				break;
			case 1:
				retorno = MovimentationIcon.OUTCOME;
				break;
			case 2:
				retorno = MovimentationIcon.INCOME_OUTCOME;
				break;				
			default:
				retorno = null;
				break;
			}
			
		}else{
			retorno = null;
		}
		if (null != cursor && !cursor.isClosed( )) {
			cursor.close( ) ;
		}
		return retorno ;		
	}	
	
}